课程视频地址:https://study.163.com/courses-search?keyword=CS231

课程主页:http://cs231n.stanford.edu/2017/

这一讲主要介绍图像分类问题。

图像分类

图像分类是计算机视觉的核心任务,问题的形式为给定图片,让计算机判断它属于哪一类,具体如下:

因为图片有视角,大小,种类差异等问题,所以直接设计一个算法来进行分类是很困难的,所以这里采取数据驱动的方法:

  • 1.收集图像数据和标签
  • 2.使用机器学习训练分类器
  • 3.在新的图片上评估分类器

程序的接口如下:

下面介绍这里使用的第一个算法Nearest Neighbor

Nearest Neighbor

Nearest Neighbor算法思路非常简单,直接计算测试图片和训练图片的“距离”,然后将距离最小的训练图片的标签附给测试图片即可,这里常用的距离如下:

${L_1}​$距离的例子如下:

不难看出这里的训练时间为$O(1)​$,预测时间为$O(N)​$,其中$N​$为训练集中图片的数量,所以这个算法在实际中不常用,因为我们一般希望预测时间要非常短。

Nearest Neighbor的自然推广是K-Nearest Neighbor,即找到距离最近的$k$个图片,根据这$k$个图片的投票结果预测图片。

于是现在产生了两个问题,K-Nearest Neighbor的$k$应该选择多少,距离应该使用哪个?这两个量被称为超参数,超参数是指算法中需要选择的参数,而不是模型本身的参数。关于超参数的选择,比较好的有如下两个方法:

第一种方法为讲数据分为训练集,验证集,以及测试集。在训练集上训练模型,通过验证集的效果来选择超参数,模型确定后在测试集上检验效果,示意图如下:

第二种方法为交叉验证。首先将数据分为训练集和测试集,然后将训练集拆分为$k$个部分,每次在$k-1$组数据上训练数据,然后在剩下一组数据上评估模型,这样一共要训练$k$次,取$k$次评估结果的平均值为最终评估结果,根据这个结果来选择超参数,示意图如下:

不难看出,第二种方法需要的计算量非常大,所以在深度学习中,这个选择超参数的方法并不常用。

在实际中,K-Nearest Neighbor从不使用,主要因为如下原因:

  • 1.测试时间太长

  • 2.像素的距离指标不提供信息,例如下面右边三个图和最左边的图的$L_2$距离相同(人为产生的),但显然这三张图差别很大

  • 3.维度灾难,即当数据的维度太大时,计算非常慢。

线性分类器(Linear Classification)

线性分类器是使用参数的方法,形式如下:

即给定一个图片,我们将其转换为向量$x$,然后计算

这里输出结果为$10​$维向量,然后根据最大分量决定图片属于哪一类,来看一个具体例子:

上图的分类器告诉我们这张图片应该分类为Dog(显然这是一个不大好的分类器)。

那么线性分类器该如何解释呢?$W$可以解释为“模具”,具体如下:

不难看出汽车类的“模具”确实和汽车非常接近。(上述“模具”产生的方式为将$W$的行向量还原为图片)

另一种解释是将图片看成高维空间中的点,那么$Wx+b=0$表示一个平面,这也是线性分类器名称的由来:

那么线性分类器是万能的吗?显然不是,例如如下几个例子都不能用线性分类器进行分类:

现在假设我们可以使用线性分类器进行分类,接下来的问题是如何找到一个好的$W$?这也是下一讲的内容。